package ztcp_server

import (
	"net"
	"sync"
)

const (
	IoTimeout = "i/o timeout" //
)

// ReceiveEvent 收到数据事件
type ReceiveEvent func(data []byte, dataSize int, cli *TcpClient) //

// ConnectEvent 连接事件
type ConnectEvent func(addr, sn string, cliIndex int, value bool) //

// ReadErrorEvent 读取错误事件
type ReadErrorEvent func(cli int, cliSn string, err error) //

type TcpServer struct {
	listen           net.Listener   // 临听对像
	clientList       []TcpClient    // 客户端列表
	dataCallback     ReceiveEvent   // 接收数据回调
	connCallback     ConnectEvent   // 连接信息回调
	onReadErrorEvent ReadErrorEvent //
	protoFormat      ProtocolFormat // 协议格式
	connMap          sync.Map       //
	maxConn          int            // 最大连接数
	connSum          int            // 当前连接总数
	chConnChange     chan int       // 连接数改变通道
	chIndex          chan int       // 存储连接数组的索引
	chClose          chan int       //
	checkConn        bool           // 连接检测开关
	connTimeout      int64          // 连接无数据包超时(秒)
	checkInterval    int            // 连接检测间隔(秒)
	checkLogin       bool           // 是否检测登录
	isJson           bool           // 数据是否为json格式
}

// TcpClient 连接服务的客户端信息
type TcpClient struct {
	Conn            net.Conn // 连接句柄
	Addr            string   // 客户端地址
	Index           int      // 在客户端列表中的索引
	ErrSum          int      // 连续错误数据包的次数
	Connected       bool     // 是否连接
	Sn              string   // 设备唯一编号
	ConnectTime     int64    // 建立连接的时间(时间截)
	LastPackageTime int64    // 最后有效数据时间(时间截)
	chLock          chan byte
}

// ProtocolFormat 协议格式
type ProtocolFormat struct {
	Head        []byte // 头数据
	End         []byte // 结尾数据
	headLen     int    // 头长度
	endLen      int    // 尾长度
	DataSize    int    // 接收数据量
	Later       bool   // 此值为真时，先接收DataSize指定长度数据（为数据头）
	LengthIndex int    // 数据头中,数据长度的索引
	LengthSize  int    // 数据头中,数据长度占用字节数量
}
